#!/bin/bash
# petteriIII 31.10.2015
# declare -A jotakin # mikäli halutaan muodostaa assosiatiivisia matriiseja täytyy tämä lause olla. Mutta jos assosiatiiviset alkavat toimia niin tavalliset lakkaavat toimimasta.

function tekijät () { apu=$( factor $1 ); echo $apu | grep -Po '(?<=:).*' ;}

function permutaatiot () { eval echo $(printf "{%s,}" "$@"); }    # kutsu-esimerkki: permutaatio a b c d

function TulostaMatriisi () {
[[ $(eval echo \${$1[*]}) ]] && { 
echo -n $1':n arvot     : '; eval echo \${$1[*]}   # arvojen väliin tulostuu välilyönti
echo -n $1':n osoitteet : '; eval echo \${!$1[*]}  # osoitteiden väliin tulostuu välilyönti. 
} | column -t; echo ;}


function lue_näppis { 
local -n array=$1 # tämä lause määrää että kun tehdään array:lle jotakin niin se siirtyy myös siihen jonka nimi on tullut parametrissa $1. 
                  # jos array:ssa ei ole kuin jäsen 0 niin se ei eroa mitenkään array-nimisestä tavallisesta muuttujasta - se voidaan tulostaakin käskyllä: echo $array.

echo "testata voi kirjoittamalla jonkun seuraavista:"
echo '- tekstijonon jossa saa olla välilyöntejä tai toisia tekstijonoja, esim: 1 2 "3 4" 5 . Jos matriisin jäsenessä on välilyöntejä on jäsen kirjoitettava lainausmerkkien väliin.'
echo '- tekstijonon voi määritellä myöskin:{1..5} tai:{1..5}{1..5} tai: {$alku..$loppu}'
echo '- numerot käsitellään tekstijonoina joten niissä voi olla mitävaan'
echo '- matriisi kirjoitetaan näin:(1 2 3) mikäli tyydytään automaattisesti määrättäviin osoitteisiin, mutta mikäli osoitteet halutaan antaa itse täytyy kirjoittaa: ([0]="1" [1]="2" [2]="3")' 
echo '- matriisin voi määritellä näinkin: ({1..5})  tai: ({1..5}{6..10})  tai: ({1..5}1 2 3) mutta tuollaisissa määritelmissä alkaa tulla eteen se että kone tulkitsee ja sinä vikiset.'
echo '- pääohjelman muuttujia voi käyttää, joten mikäli alku ja loppu ovat määriteltyjä niin ihan ihan käypä käsky on: ({$alku..$loppu}{$loppu..$alku})'
echo '- tulosteessa tekstijonon erottaa matriisista siitä, että mariisin jäsenistä tulostetaan myös osoitteet.' 
echo '- assosiatiivinen matriisi täytyy aina kirjoittaa näin: ([bbb]="eee" [ccc]="fff" [aaa]="ddd" )'
echo '- permutaatiot saa tietää tämänmuotoisella käskyllä: permutaatiot a b c d e'
echo '- luvun tekijät saa tietää tämänmuotoisella käskyllä: tekijät 256'
echo '- myös tiedoston sisällöstä voi muodostaa matriisin:  /etc/fstab tai:/boot/grub/grub.cfg'
echo '- vanhoja vastauksia voi selailla nuolinäppämillä ja ctrl-r toimii normaalisti.'
echo '- editointi toimii kokoajan' 
echo 'kirjoita jotakin: '

HISTFILE=~/.user_history # tämän skriptin toiminta-ajaksi siirretään BASH:in oma historia-toiminta tälle skriptille. Esimerkiksi "ctrl r" toimii niinkuin kaikki muukin.
set -o history  
read -e array ; echo $array >> ~/.user_history     
HISTFILE=~/.bash_history
set -o history

[[ $(echo $array | grep tekijät) ]] && array=($($array))      # array saa arvot funktion tekijät      kutsusta - parametrit ovat kutsussa
[[ $(echo $array | grep permutaatiot) ]] && array=($($array)) # array saa arvot funktion permutaatiot kutsusta - parametrit ovat kutsussa
[[ ${array:0:1} = '(' && ${array:${#array}-1} = ')'  ]] && { apu=$(echo $array | grep -o {.*}); apuu=$(eval echo $apu); array=$(echo $array | sed "s/$apu/$apuu/g"); eval array=$array ;} 
[[ ${array:0:1} = '{' && ${array:${#array}-1} = '}'  ]] && array="$( eval eval echo $array)"
[[ ${array:0:1} = '/' ]] && readarray array < $array && echo -e "${array[*]}"
}

# pääohjelmassa oltaessa:
alku=1; loppu=5
lue_näppis jotakin # mikäli halutaan lukea jo olemassa oleva matriisi niin sen nimi tulee paikalle:jotakin tässä ja seuraavassa lauseessa jos seuraavaa lausetta edes tarvitaan.
[[ $(echo ${!jotakin[@]} | cut -sd' ' -f 2) ]] && TulostaMatriisi jotakin || echo $jotakin # [[ $(echo ${jotakin[@]} | cut -sd' ' -f 2) ]] on testi siitä onko kyseessä matriisi
# jos on luettu tiedosto on sen sisältö matriisissa jonka nimi tässä on:jotakin , mutta sen tilalle voi kirjoittaa halutun matriisin nimen.

